package com.cw.jeeyt.service.impl.system;

import java.io.File;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.cw.jeeyt.common.enums.EnumTemplateType;
import com.cw.jeeyt.common.utils.FileUtils;
import com.cw.jeeyt.common.utils.Html2PlainText;
import com.cw.jeeyt.common.utils.StringUtil;
import com.cw.jeeyt.common.utils.StringUtils;
import com.cw.jeeyt.service.bo.system.SystemTemplateInfoBo;
import com.cw.jeeyt.core.util.SessionUtil;
import com.cw.jeeyt.dao.intf.system.SystemProjectInfoDao;
import com.cw.jeeyt.dao.intf.system.SystemTemplateInfoDao;
import com.cw.jeeyt.dao.intf.system.SystemTemplateModuleInfoDao;
import com.cw.jeeyt.dao.model.system.SystemProjectInfoDo;
import com.cw.jeeyt.dao.model.system.SystemTemplateInfoDo;
import com.cw.jeeyt.dao.model.system.SystemTemplateModuleInfoDo;
import com.cw.jeeyt.dao.query.system.SystemProjectInfoQuery;
import com.cw.jeeyt.service.converter.system.SystemTemplateInfoConverter;
import com.cw.jeeyt.service.intf.system.SystemTemplateInfoService;
import com.cw.lang.common.utils.CollectionUtil;
import com.cw.lang.mybatis.dto.PageInfo;
import com.cw.lang.common.utils.SequenceTool;

/**
 * 生成代码模板信息业务实现类
 *
 * @author chenw
 * @version 1.0.0
 */
@Service
public class SystemTemplateInfoServiceImpl implements SystemTemplateInfoService {

    private static final Logger logger = LoggerFactory.getLogger(SystemTemplateInfoServiceImpl.class);
    @Autowired
    private SystemTemplateInfoDao systemTemplateInfoDao;
    @Autowired
    private SystemTemplateModuleInfoDao systemTemplateModuleInfoDao;
    @Autowired
    private SystemProjectInfoDao systemProjectInfoDao;

    /**
     * 分页查询生成代码模板信息
     *
     * @param systemTemplateInfoBo
     * @param startNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    @Override
    public PageInfo<SystemTemplateInfoBo> queryByPage(SystemTemplateInfoBo systemTemplateInfoBo, Integer startNum,
        Integer pageSize) throws Exception {
        PageInfo<SystemTemplateInfoDo> pageInfo = systemTemplateInfoDao.queryByPage(
            SystemTemplateInfoConverter.bo2Do(systemTemplateInfoBo), startNum, pageSize);
        return new PageInfo<>(pageInfo, SystemTemplateInfoConverter.doList2BoList(pageInfo.getList()));
    }

    /**
     * 克隆模板信息
     *
     * @param systemTemplateInfoBo
     * @param templateId
     */
    @Override
    public void cloneTemplate(SystemTemplateInfoBo systemTemplateInfoBo, String templateId) {
        SystemTemplateInfoDo oldTemplateInfo = systemTemplateInfoDao.getById(templateId);
        List<SystemTemplateModuleInfoDo> oldModuleInfoDos = systemTemplateModuleInfoDao.queryListByTemplateId(
            templateId);
        SystemTemplateInfoDo templateInfoDo = oldTemplateInfo;
        templateInfoDo.setTemplateCode(systemTemplateInfoBo.getTemplateCode());
        templateInfoDo.setTemplateName(systemTemplateInfoBo.getTemplateName());
        String newTemplateId = SequenceTool.nextId();
        templateInfoDo.setId(newTemplateId);
        templateInfoDo.setCreateBy(SessionUtil.getSessionUserId());
        templateInfoDo.setCreateDate(new Date());
        templateInfoDo.setUpdateDate(new Date());
        templateInfoDo.setUpdateBy(SessionUtil.getSessionUserId());
        if (!CollectionUtil.isEmpty(oldModuleInfoDos)) {
            for (SystemTemplateModuleInfoDo moduleInfoDo : oldModuleInfoDos) {
                moduleInfoDo.setId(SequenceTool.nextId());
                moduleInfoDo.setTemplateId(newTemplateId);
            }
            systemTemplateModuleInfoDao.insertList(oldModuleInfoDos);
        }
        systemTemplateInfoDao.insert(templateInfoDo);
    }

    /**
     * 根据主键查寻生成代码模板信息
     *
     * @param id
     * @return
     */
    @Override
    public SystemTemplateInfoBo getSystemTemplateInfoById(String id) throws Exception {

        if (StringUtils.isEmpty(id)) {
            logger.error("--主键id为空--");
            return null;
        }
        return SystemTemplateInfoConverter.do2Bo(systemTemplateInfoDao.getById(id));
    }

    /**
     * 新增生成代码模板信息
     *
     * @param systemTemplateInfoBo
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public String insert(SystemTemplateInfoBo systemTemplateInfoBo) throws Exception {

        if (systemTemplateInfoBo == null) {
            logger.error("生成代码模板信息为空");
            return null;
        }
        SystemTemplateInfoDo systemTemplateInfo = SystemTemplateInfoConverter.bo2Do(systemTemplateInfoBo);
        String id = SequenceTool.nextId();
        systemTemplateInfo.setId(id);
        systemTemplateInfo.setCreateBy(SessionUtil.getSessionUserId());
        systemTemplateInfo.setCreateDate(new Date());
        systemTemplateInfo.setUpdateBy(SessionUtil.getSessionUserId());
        systemTemplateInfo.setUpdateDate(new Date());
        systemTemplateInfoDao.insert(systemTemplateInfo);
        return id;
    }

    /**
     * 更新生成代码模板信息
     *
     * @param systemTemplateInfoBo
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void update(SystemTemplateInfoBo systemTemplateInfoBo) throws Exception {

        if (systemTemplateInfoBo == null) {
            logger.error("生成代码模板信息为空");
            return;
        }

        SystemTemplateInfoDo systemTemplateInfo = SystemTemplateInfoConverter.bo2Do(systemTemplateInfoBo);
        systemTemplateInfo.setUpdateBy(SessionUtil.getSessionUserId());
        systemTemplateInfo.setUpdateDate(new Date());

        systemTemplateInfoDao.update(systemTemplateInfo);
    }

    /**
     * 删除生成代码模板信息
     *
     * @param systemTemplateInfoBo
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(SystemTemplateInfoBo systemTemplateInfoBo) throws Exception {

        if (systemTemplateInfoBo == null) {
            logger.error("生成代码模板信息为空");
            return;
        }
        //判断当前模板是否正在使用，使用中的模板不能被删除
        String templateId = systemTemplateInfoBo.getId();
        List<SystemProjectInfoDo> projectInfoDos = systemProjectInfoDao.selectByExample(SystemProjectInfoQuery.builder()
            .templateId(templateId)
            .build());
        if (CollectionUtil.isNotEmpty(projectInfoDos)) {
            String projectInfos = "";
            for (SystemProjectInfoDo projectInfoDo : projectInfoDos) {
                if (StringUtil.isEmpty(projectInfos)) {
                    projectInfos = projectInfoDo.getProjectCode();
                } else {
                    projectInfos = projectInfos + "," + projectInfoDo.getProjectCode();
                }
            }
            throw new Exception("当前模板在【" + projectInfos + "】中使用，不能删除");
        }
        SystemTemplateInfoDo systemTemplateInfo = SystemTemplateInfoConverter.bo2Do(systemTemplateInfoBo);
        systemTemplateInfoDao.delete(systemTemplateInfo);
    }

    /**
     * 初始化模板,从配置读取内容覆盖模板文件
     *
     * @param systemTemplateInfoBo
     */
    @Override
    public void initTemplateFile(SystemTemplateInfoBo systemTemplateInfoBo) {
        String templateId = systemTemplateInfoBo.getId();
        SystemTemplateInfoDo systemTemplateInfo = systemTemplateInfoDao.getById(templateId);
        String javaTemplatePath = systemTemplateInfo.getTemplateJavaPath();
        String pageTemplatePath = systemTemplateInfo.getTemplatePagePath();
        String xmlTemplatePath = systemTemplateInfo.getTemplateXmlPath();
        List<SystemTemplateModuleInfoDo> stmibList = systemTemplateModuleInfoDao.queryListByTemplateId(templateId);
        if (CollectionUtil.isNotEmpty(stmibList)) {
            for (SystemTemplateModuleInfoDo stmi : stmibList) {
                String moduleContent = stmi.getTemplateModuleContent();
                String moduleName = stmi.getTemplateModuleName();
                String moduleType = stmi.getTemplateModuleType();
                String filePath = "";
                if (EnumTemplateType.JAVA.getCode()
                    .equals(moduleType)) {
                    filePath = javaTemplatePath + File.separator + moduleName;
                } else if (EnumTemplateType.PAGE.getCode()
                    .equals(moduleType)) {
                    filePath = pageTemplatePath + File.separator + moduleName;
                } else if (EnumTemplateType.XML.getCode()
                    .equals(moduleType)) {
                    filePath = xmlTemplatePath + File.separator + moduleName;
                } else {
                    logger.error("【初始化模板】未找到模板对应的类型");
                }
                if (StringUtil.isNotEmpty(filePath) && StringUtil.isNotEmpty(moduleContent)) {
                    FileUtils.createFile(filePath);
                    FileUtils.writeToFile(filePath, Html2PlainText.convert(moduleContent), "utf-8");
                }
            }
        }
    }
}
